package com.collection.common.base;

import java.io.Serializable;
import java.util.List;

import com.collection.util.Order;


/**
 * dao基类
 * @author 冯勇
 *
 * @param <T>
 */
public interface BaseDao<T> {
	
	/**
	 * 获取实体
	 * @param entityClass
	 * @param pk
	 * @return
	 */
	T get(Class<T> entityClass, Serializable pk);
	
	/**
	 * 保存实体
	 * @param entity
	 */
	void save(T entity);
	
	/**
	 * 更新实体
	 * @param entity
	 */
	void update(T entity);
	
	/**
	 * 通过HQL查询实体列表
	 * @param hql
	 * @return
	 */
	List<T> queryByHQL(String hql);
	
	/**
	 * 通过HQL查询从begin开始，大小为length的实体列表
	 * @param hql
	 * @param begin 开始位置
	 * @param length 大小
	 * @return
	 */
	List<T> queryByHQL(String hql, int begin, int length);
	
	/**
	 * 通过HQL查询从begin开始，大小为length,排序实体列表
	 * @param hql
	 * @param begin 开始位置
	 * @param length 大小
	 * @param order 排序方式
	 * @return
	 */
	List<T> queryByHQL(String hql,int begin, int length, Order order);
	
	/**
	 * 通过HQL,及相应的参数值查询实体列表
	 * @param hql
	 * @param paramsValues
	 * @return
	 */
	List<T> queryByHQL(String hql, Object[] paramsValues);
	
	/**
	 * 过HQL,及相应的参数值,并进行排序查询实体列表
	 * @param hql
	 * @param paramsValues
	 * @param order
	 * @return
	 */
	List<T> queryByHQL(String hql, Object[] paramsValues, Order order);
	
	/**
	 * 过HQL,及相应的参数值,并从begin开始，大小为length查询实体列表
	 * @param hql
	 * @param paramsValues
	 * @param begin
	 * @param length
	 * @return
	 */
	List<T> queryByHQL(String hql, Object[] paramsValues, int begin, int length);
	
	/**
	 * 过HQL,及相应的参数值,并从begin开始，大小为length，并进行排序查询实体列表
	 * @param hql
	 * @param paramsValues
	 * @param begin
	 * @param length
	 * @return
	 */
	List<T> queryByHQL(String hql, Object[] paramsValues, int begin, int length, Order order);
	
	/**
	 * 通过HQL,及参数值计算记录数
	 * @param hql
	 * @param paramValues
	 * @return
	 */
    int getRecordCount(String hql, Object[] paramValues);
    
    /**
     * 通过hql计算记录数
     * @param hql
     * @return
     */
    public int getRecordCount(String hql);
    
    /**
     * 删除实体
     * @param entity
     */
	void delete(T entity);
	
	/**
	 * 通过hql删除实体
	 * @param hql
	 */
	void deleteByHQL(String hql);
	
	/**
	 * 清空实体
	 * @param entityClass
	 */
	void clear(Class<T> entityClass);
}
